import config from '@/conf/config.js'
export default {
	namespaced: true,
	state: () => ({
		socketTask: null, //socket实例
		eventlist: {}, // socket返回的数据
		is_open_socket: false, //避免重复连接
		connectNum: 1, // 重连次数
		
		repairType:'',//保修类型
		
		reconnectTimeOut:null //重连定时器
	}),
	mutations: {
		// socket 创建连接
		WEBSOCKET_INIT(state, userData) {
			const that = this
			// 创建一个this.socketTask对象【发送、接收、关闭socket都由这个对象操作】
			let appId = "992020022270580001"
			let url = `${config.websocketUrl}/${appId}/${userData.userId}/${userData.communityId}`
			state.socketTask = uni.connectSocket({
				url,
				// 【非常重要】必须确保你的服务器是成功的,如果是手机测试千万别使用ws://127.0.0.1:9099【特别容易犯的错误】
				success(data) {
					console.log("websocket连接成功");
					state.is_open_socket = true
					if(state.reconnectTimeOut !== null){
						clearInterval(state.reconnectTimeOut)
					}
				},
			});
			// 消息的发送和接收必须在正常连接打开中,才能发送或接收【否则会失败】
			state.socketTask.onOpen((res) => {
				console.log("WebSocket连接正常打开中...！");
				state.is_open_socket = true;
				// 注：只有连接正常打开中 ，才能正常收到消息
				state.socketTask.onMessage((res) => {
					console.log("收到服务器内容：", res.data);
						// console.log('webSocketRes：',JSON.parse(JSON.parse(res.data).title))
						// console.log('type',JSON.parse(res.data).type)
						if(res.data !='已登录'){
							state.repairType = JSON.parse(res.data).type
							state.eventlist = JSON.parse(res.data).title
						}

					// state.unread.push(JSON.parse(res.data))
				});
			})
			// 监听连接失败，这里代码我注释掉的原因是因为如果服务器关闭后，和下面的onclose方法一起发起重连操作，这样会导致重复连接
			uni.onSocketError((res) => {
				console.log('WebSocket连接打开失败，请检查！');
				state.socketTask = null
				state.is_open_socket = false;
				clearInterval(state.reconnectTimeOut)
				if (state.connectNum < 6) {
					uni.showToast({
						title: `WebSocket连接失败，正尝试第${state.connectNum}次连接`,
						icon: "none"
					})
					that.commit('websocket/reconnect');//重新连接
					state.connectNum += 1
				} else {
					state.connectNum = 1
				}

			})
		},
		// socket 发送
		WEBSOCKET_SEND(state, p) {
			console.log("ws发送！");
			state.socketTask.send({
				data: p,
				async success() {
					console.log("消息发送成功");
				},
			});
		},
		// socket 关闭
		WEBSOCKET_CLOSE(state) {
			if (!state.is_open_socket) {
				return
			}
			// if (state.socketTask !== null) {
			state.socketTask.close({
				success(res) {
					state.is_open_socket = false;
					console.log("关闭成功", res)
				},
				fail(err) {
					console.log("关闭失败", err)
				}
			})
			// }
		},
		// socket  重新连接
		reconnect(state) {
			console.log('触发socket  重新连接')
			var that = this
			//如果不是人为关闭的话，进行重连
			if (!state.is_open_socket && state.socketTask == null) {
				console.log('socket重连中')
				let userData = {
					userId:this.state.user.userId,
					communityId:this.state.user.userCommunity.communityId
				}
				state.reconnectTimeOut = setInterval(() => {
					that.commit('websocket/WEBSOCKET_INIT',userData)
				}, 5000)
			}
		}
	},
	actions: {
		WEBSOCKET_INIT({
			commit
		}, userData) {
			commit('WEBSOCKET_INIT', userData)
		},
		WEBSOCKET_SEND({
			commit
		}, p) {
			commit('WEBSOCKET_SEND', p)
		},
		WEBSOCKET_CLOSE({
			commit
		}, p) {
			commit('WEBSOCKET_CLOSE')
		}
	}
}
